package com.alderfgdev.opendoc.seguridad.business;

import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;
import com.alderfgdev.opendoc.seguridad.beans.E_Opcion;
import com.alderfgdev.opendoc.seguridad.beans.E_Usuario;
import com.alderfgdev.opendoc.seguridad.service.UsuarioServiceI;
import com.alderfgdev.opendoc.seguridad.service.SeguridadBusinessDelegate;


public class N_Login {

	private N_Login() {}
	
	public static String login(HttpServletRequest request,E_Usuario objE_Usuario){
		String strResultado = "false";
		UsuarioServiceI objUsuarioService = SeguridadBusinessDelegate.getUsuarioService();
		E_Usuario objE_UsuarioLogin;
		try {
			
			if(!(objE_Usuario.getStrLogin_Usu().equals(""))){
				if(!(objE_Usuario.getStrClave_Usu().equals(""))){
					
					objE_UsuarioLogin = objUsuarioService.buscarPorUsuario(objE_Usuario.getStrLogin_Usu());
	
					if(objE_UsuarioLogin != null){
						if(objE_UsuarioLogin.getStrClave_Usu().equals(objE_Usuario.getStrClave_Usu())){
							if(objE_UsuarioLogin.getIntEstado_Usu() == 1){
								strResultado = "true";
								
								objE_UsuarioLogin.setObjE_Avatar(objUsuarioService.buscarAvatarPorCodigo(objE_UsuarioLogin.getIntCodigo_Avatar()));
								objE_UsuarioLogin.setLstE_Opcion(obtenerOpcionesUsuario(objE_UsuarioLogin));
								
								ArrayList<E_Usuario> lstUsuarioSessionDTO = (ArrayList<E_Usuario>) request.getSession().getServletContext().getAttribute("lstUsuarioSessionDTO");
								
								System.out.println("ES NULL ?: "+lstUsuarioSessionDTO);
								
								if(lstUsuarioSessionDTO == null)
									lstUsuarioSessionDTO = new ArrayList<E_Usuario>();
								
								boolean existe = true;
								
								for(E_Usuario usu :lstUsuarioSessionDTO){
									if(objE_UsuarioLogin.getIntCodigo_Usu() == usu.getIntCodigo_Usu())
										existe = false;
								}
								
								if(existe){
									lstUsuarioSessionDTO.add(objE_UsuarioLogin);
								}
								
								request.getSession().getServletContext().setAttribute("lstUsuarioSessionDTO", lstUsuarioSessionDTO);
								request.getSession().setAttribute("lstOpciones", obtenerOpcionesUsuario(objE_UsuarioLogin));
								request.getSession().setAttribute("objE_Usuario", objE_UsuarioLogin);
							}else{
								request.setAttribute("strMensaje", "El usuario no se encuentra habilitado");
							}
						}else{
							request.setAttribute("strMensaje", "No se puede acceder al sistema.<br> Verifique usuario y clave");
						}
					}else{
						request.setAttribute("strMensaje", "No se puede acceder al sistema.<br> Verifique usuario y clave");
					}
				}
				else{
						request.setAttribute("strMensaje", "Ingrese la clave.");
				}
			}else{
				request.setAttribute("strMensaje", "Ingrese el usuario.");
			}
		} catch (Exception e) {
			request.setAttribute("strMensaje", e.getCause());e.printStackTrace();}
		return strResultado;
	}
	
	public static ArrayList<E_Opcion> obtenerOpcionesUsuario(E_Usuario objE_Usuario){
		ArrayList<E_Opcion> lstE_Opcion = null;
		UsuarioServiceI objUsuarioService = SeguridadBusinessDelegate.getUsuarioService();
		try {
			
			lstE_Opcion = objUsuarioService.listarOpcionesPorRol(objE_Usuario.getIntCodigo_Rol());
			
			if(lstE_Opcion != null && lstE_Opcion.size() > 0){
			
				ArrayList<E_Opcion> lstE_OpcionNivel2 = new ArrayList<E_Opcion>();
				
				for(int i = 0; i < lstE_Opcion.size(); i++){
				
					if(lstE_Opcion.get(i).getIntNivel_Opc() == 2){
						lstE_OpcionNivel2.add(lstE_Opcion.get(i));
						lstE_Opcion.remove(i);
						i--;
					}
					
				}
				
				if(lstE_OpcionNivel2 != null && lstE_OpcionNivel2.size() > 0){
				
					for(int j = 0; j < lstE_Opcion.size(); j++){
						ArrayList<E_Opcion> lstE_OpcionHijos = new ArrayList<E_Opcion>();
						
						for(int k = 0;k < lstE_OpcionNivel2.size(); k++){
							if(lstE_Opcion.get(j).getIntCodigo_Opc() == lstE_OpcionNivel2.get(k).getIntCodigoPadre_Opc())
								lstE_OpcionHijos.add(lstE_OpcionNivel2.get(k));
						}
						
						lstE_Opcion.get(j).setLstE_Opcion(lstE_OpcionHijos);
					}
					
				}
				
			}
			
		}catch (Exception e) {e.printStackTrace();}
		return lstE_Opcion;
	}

	public static void logout(HttpServletRequest request) {
		try {
			
			request.getSession().removeAttribute("objE_Usuario");
			request.getSession().invalidate();
			
		}catch (Exception e) {e.printStackTrace();}
	}
	
}
